/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package interfaz;

import Tiempo.SntpClient;
import clasesJXTA.NodoRemoto;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.border.TitledBorder;
import compumundohipermegared.Compumundohipermegared;
import compumundohipermegared.Foto;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Observer;
import seguridad.ManejadorCertificados;

/**
 *
 * @author Asistente
 */
public class InterfazFotosP2P extends JFrame
{
    private Compumundohipermegared compumundohipermegared;
    
    public final static String ARCHIVO_LLAVE_PRIVADA ="./data/miLlavePrivada";
    public final static String ARCHIVO_CERTIFICADO ="./data/miCertificado.cer";
    
    private PanelMisFotos panelMisFotos;
    
    private PanelBuscarFotos panelBuscarFotos;
    
    private BarraMenu menu;
    
    public InterfazFotosP2P( String nNombre )
    {
        eliminarCache( );
        
        try
        {
            compumundohipermegared = new Compumundohipermegared( nNombre, this );
        }
        catch( Exception e )
        {
            e.printStackTrace( );
        }
        
        setTitle( "Compumundohipermegared - " + nNombre );
        setSize( 600, 500 );
        setResizable( false );
        setLocationRelativeTo( null );
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        setLayout( new BorderLayout( ) );
        
        menu = new BarraMenu( this );
        setJMenuBar( menu );
        
        panelMisFotos = new PanelMisFotos( this );
        panelMisFotos.setBorder( new TitledBorder( "Compartidor" ) );
        panelMisFotos.setPreferredSize( new Dimension( 0, 250 ) );
        add( panelMisFotos, BorderLayout.CENTER );
        
        panelBuscarFotos = new PanelBuscarFotos( this );
        compumundohipermegared.addObserver( panelBuscarFotos );
        panelBuscarFotos.setBorder( new TitledBorder( "Buscador" ) );
        panelBuscarFotos.setPreferredSize( new Dimension( 0, 250 ) );
        add( panelBuscarFotos, BorderLayout.SOUTH );
    }
    
    public void agregarObservador(Observer ob){
        compumundohipermegared.addObserver(ob);
    }
    public void compartirFoto( ) 
    {
        if( compumundohipermegared.tieneCertificado( ) )
        {
            FileSystemView fsv = FileSystemView.getFileSystemView( );
            JFileChooser fc = new JFileChooser( fsv.getRoots( )[ 0 ] );
            FileFilter filter1 = new ExtensionFileFilter( "JPG, PNG & GIF", new String[ ] { "JPG", "JPEG", "PNG", "GIF" } );
            fc.setFileFilter(filter1);
            fc.setDialogTitle( "Compartir Foto" );
            int resultado = fc.showOpenDialog( this );
            if( resultado == JFileChooser.APPROVE_OPTION )
            {
                File archivo = fc.getSelectedFile( );
                if( archivo != null )
                {
                    DialogoCompartirFoto dialogoCompartirFoto = new DialogoCompartirFoto( this );
                    dialogoCompartirFoto.setVisible( true );

                    if( dialogoCompartirFoto.darOK( ) )
                    {
                        try 
                        {
                            String ruta = archivo.getAbsolutePath( );
                            String rutaMod = ruta.replace( ".", "-@-" );
                            String extension = rutaMod.split( "-@-" )[ 1 ];

                            String idFoto = "";

                            // acá genera un numero aleatorio para la foto
                            int numAleatorio = (int )System.currentTimeMillis();
                            int numAleatorioCorto = numAleatorio % 1000001;

                            idFoto = numAleatorioCorto+"@"+dialogoCompartirFoto.darID();

                            String personasEnFoto="'"+dialogoCompartirFoto.darPersonas()+"'";

                            File of = new File( "./data/imagenes/" + idFoto + "." + extension );

                            FileInputStream in = new FileInputStream( archivo );
                            FileOutputStream out = new FileOutputStream( of );

                            int c;
                            while( ( c = in.read( ) ) != -1 )
                            {
                                out.write(c);
                            }

                            ImageIcon  ic = new ImageIcon( "./data/imagenes/" + idFoto + "." + extension );
                            System.out.println("ImagenSubida: ");
                            int altoImagen = ic.getIconHeight( );
                            int anchoImagen = ic.getIconWidth( );
                            System.out.println("Obteniendo Fecha");
                            //Date fechaServidor = SntpClient.getDateUTC(compumundohipermegared.SERVIDOR_DE_TIEMPO);
                            System.out.println("Fecha Obtenida");
                            compumundohipermegared.agregarFoto( idFoto, extension, personasEnFoto, new Date( System.currentTimeMillis( ) ), true, of.getAbsolutePath() , altoImagen, anchoImagen);

                            in.close();
                            out.close();
                            ManejadorCertificados.cifrarArchivo(of.getAbsolutePath(), compumundohipermegared.contrasenaEscogida);
                        } 
                        catch( Exception e )
                        {
                            System.err.println( "Hubo un error de entrada o salida" );
                        }

                        panelMisFotos.actualizar( compumundohipermegared.getFotosEnMiEquipo( ) );
                    }
                }
            }
        }
        else
        {
            JOptionPane.showMessageDialog( this, "Debe solicitar un certificado primero", "Atención", JOptionPane.INFORMATION_MESSAGE );
        }
    }
    /**
     * actualiza la foto las fotos en este qeuipo para que se muesteren correctamenten en  la interfaz
     */
    public void actualizarFotosMias(ArrayList<Foto> fotosEnMiEquipo){
          panelMisFotos.actualizar(fotosEnMiEquipo);   
    }
    
    public void verFoto( Foto foto )
    {
        if( compumundohipermegared.tieneCertificado( ) )
        {
            DialogoVerFoto dialogoVerFoto = new DialogoVerFoto( this, foto );
            dialogoVerFoto.setVisible( true );
        }
        else
        {
            JOptionPane.showMessageDialog( this, "Debe solicitar un certificado primero", "Atención", JOptionPane.INFORMATION_MESSAGE );
        }
    }
    
    public void buscarFotos( )
    {
        if( compumundohipermegared.tieneCertificado() )
        {
            DialogoBuscarFotos dialogoBuscarFotos = new DialogoBuscarFotos( this );
            dialogoBuscarFotos.setVisible( true );
        }
        else
        {
            JOptionPane.showMessageDialog( this, "Debe solicitar un certificado primero", "Atención", JOptionPane.INFORMATION_MESSAGE );
        }
    }
    
    public void buscarPorID( String nID )
    {
        if( compumundohipermegared.tieneCertificado( ) )
        {
            compumundohipermegared.buscarPorID( nID );
        }
        else
        {
            JOptionPane.showMessageDialog( this, "Debe solicitar un certificado primero", "Atención", JOptionPane.INFORMATION_MESSAGE );
        }
    }
    
    public void buscarPorPersonas( String nPersonas )
    {
        if( compumundohipermegared.tieneCertificado( ) )
        {
            compumundohipermegared.buscarPorPersonas( nPersonas );
        }
        else
        {
            JOptionPane.showMessageDialog( this, "Debe solicitar un certificado primero", "Atención", JOptionPane.INFORMATION_MESSAGE );
        }
    }
        
    /**
     * 
     * @param nombreUsuario
     * @param nombreArchivo
     * @param ipUsuario 
     */
    void descargarFoto(String nombreUsuario, String nombreArchivo, String ipUsuario) 
    {
        System.out.println("Conectando con el otro usuario...");
    }

    void descargarFoto(String nombreArchivo, NodoRemoto nodoRemoto)
    {
        if( compumundohipermegared.tieneCertificado( ) )
        {
            try 
            {
                compumundohipermegared.descargarFoto(nombreArchivo, nodoRemoto);
            } 
            catch( IOException ex ) 
            {
                JOptionPane.showMessageDialog(this, "hubo un error al intentar descargar una foto: "+ ex.getMessage());
                ex.printStackTrace();
            }
        }
        else
        {
            JOptionPane.showMessageDialog( this, "Debe solicitar un certificado primero", "Atención", JOptionPane.INFORMATION_MESSAGE );
        }
    }
    
    public void buscarFotoMasParecida( Foto foto )
    {
        if( compumundohipermegared.tieneCertificado( ) )
        {
            compumundohipermegared.buscarFotoMasParecida( foto );
        }
        else
        {
            JOptionPane.showMessageDialog( this, "Debe solicitar un certificado primero", "Atención", JOptionPane.INFORMATION_MESSAGE );
        }
    }
    
    private void eliminarCache( )
    {
        File cache = new File( "./data/cache" );
        if(cache.exists())
        eliminarCarpeta( cache );
        
        cache.delete( );
    }
    
    private void eliminarCarpeta( File archivo )
    {
        File[] ficheros = archivo.listFiles( );
 
        for ( int x=0; x < ficheros.length; x++ )
        {
            if ( ficheros[x].isDirectory( ) )
            {
                eliminarCarpeta( ficheros[x] );
            }
            ficheros[x].delete( );
        }
    }
    
    public static void main( String[] args )
    {
        String nombre = JOptionPane.showInputDialog( "Ingrese su Usuario:" );
        
        if( nombre != null )
        {
            if( !nombre.equals( "" ) )
            {
                InterfazFotosP2P ventana = new InterfazFotosP2P( nombre );
                ventana.setVisible( true );
            }
        }
    }
    
     /**
     * bloquea al sistema porque alguien está buscando por foto mas parecida
     */
    public void bloquearSistema( )
    {
        JOptionPane.showMessageDialog(this, "Se ha bloqueado el sistema \n porque alguien esta bustando foto mas parecida", "Información", JOptionPane.INFORMATION_MESSAGE);
        panelBuscarFotos.deshabilitar( );
        panelMisFotos.deshabilitar( );
        menu.bloquear( );
    }

    public void desbloquear( )
    {
        panelBuscarFotos.habilitar( );
        panelMisFotos.habilitar( );
        menu.desbloquear( );
    }

    void abrir( )
    {
        File archivo = new File( "./data/estados" );        
        JFileChooser fc = new JFileChooser( archivo );
        fc.setDialogTitle( "Abrir estado" );
        fc.setFileSelectionMode( JFileChooser.FILES_ONLY );
        fc.setMultiSelectionEnabled( false );

        int resultado = fc.showOpenDialog( this );

        if( resultado == JFileChooser.APPROVE_OPTION )
        {
            File seleccionado = fc.getSelectedFile( );
            compumundohipermegared.anunciarCargarEstado(seleccionado.getName());
            compumundohipermegared.cargarEstado( seleccionado.getName() );
        }
    }

    void salvar( ) 
    {
        compumundohipermegared.anunciarSalvarEstado( compumundohipermegared.generarNombreArchivoGuardar());
    }
    
    public void fotosPendientes( )
    {
        JOptionPane.showMessageDialog( this, "Hay fotos pendientes por descargar", "Información", JOptionPane.INFORMATION_MESSAGE );
    }

    void generarCertificado(String contraseniaLlavePrivada) {
        
       compumundohipermegared.generarGertificado(contraseniaLlavePrivada);
    }

    String darContrasenaEscogida() {
        return compumundohipermegared.contrasenaEscogida;
    }
}
